﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using Datos;

namespace Negocio
{
    public class Articulo : Base
    {
        #region Constantes

        const string ERR_SOURCE = "Articulo";

        #endregion

        private string _id;
        public string Id
        {
            get { return _id; }
            set { _id = value; MarcarModificado(); }
        }

        private string _nombre;
        public string Nombre
        {
            get { return _nombre; }
            set { _nombre = value; MarcarModificado(); }
        }

        private decimal _precio;
        public decimal Precio
        {
            get { return _precio; }
            set { _precio = value; MarcarModificado(); }
        }

        private string _observacion;
        public string Observacion
        {
            get { return _observacion; }
            set { _observacion = value; MarcarModificado(); }
        }

        private string _foto;
        public string Foto
        {
            get { return _foto; }
            set { _foto = value; MarcarModificado(); }
        }

        private int _stock;
        public int Stock
        {
            get { return _stock; }
            set { _stock = value; MarcarModificado(); }
        }

        public string ArticuloString
        {
            get { return _nombre + " - " + _id; }
        }

        #region Acceso a Datos

        protected override bool LeerDB()
        {
            bool existe = false;
            object[] parametros = { _id, null, null, null, null, null };
            IDataReader dr = DatosOleDb.DB().ObtenerDataReader("ArticuloSFiltro", parametros);
            if (dr.Read())
            {
                CargarDR(dr);
                existe = true;
            }

            dr.Close();
            return existe;
        }

        protected override void InsertDB()
        {
		object[] parametros = new object[] {_id , _nombre , _precio , _observacion , _foto , _stock };
            DatosOleDb.DB().TxBegin();
            try
            {
                DatosOleDb.DB().EnviarDatos("ArticuloI", ref parametros);
                DatosOleDb.DB().TxCommit();
            }
            catch (System.Data.SqlClient.SqlException)
            {
                DatosOleDb.DB().TxRollback();
                DatosException ex = new DatosException("Ya existe un Articulo con el id " + _id, ERR_SOURCE);
                throw ex;
            }
            catch (Exception)
            {
                DatosOleDb.DB().TxRollback();
                throw;
            }
        }

        protected override void UpdateDB()
        {
		object[] parametros = new object[] {_id , _nombre , _precio , _observacion , _foto , _stock };
            DatosOleDb.DB().TxBegin();
            try
            {
                DatosOleDb.DB().EnviarDatos("ArticuloU", ref parametros);
                DatosOleDb.DB().TxCommit();
            }
            catch (System.Data.SqlClient.SqlException)
            {
                DatosOleDb.DB().TxRollback();
                DatosException ex = new DatosException("Ya existe un Articulo con el id " + _id, ERR_SOURCE);
                throw ex;
            }
            catch (Exception)
            {
                DatosOleDb.DB().TxRollback();
                throw;
            }
        }

        protected override void DeleteDB()
        {
            object[] parametros = new object[] {_id };
            DatosOleDb.DB().TxBegin();
            try
            {
                DatosOleDb.DB().EnviarDatos("ArticuloD", ref parametros);
                DatosOleDb.DB().TxCommit();
            }
            catch (Exception)
            {
                DatosOleDb.DB().TxRollback();
                throw;
            }
        }

        protected override void CargarDR(IDataReader dr)
        {          
      		_id = dr["id"].ToString();
            _nombre = dr["nombre"].ToString();
            _precio = Decimal.Parse(dr["precio"].ToString());
            _observacion = dr["observacion"].ToString();
            _foto = dr["foto"].ToString();
            _stock = (Int32) dr["stock"];
            MarcarViejo();
        }

        public override void Validar()
        {
            InconsistenciaException ex = new InconsistenciaException();
            ex.Source = ERR_SOURCE;
            if (_id == string.Empty) ex.AgregarError("Dato requerido", "Id");
            if (_nombre == string.Empty) ex.AgregarError("Dato requerido", "Nombre");
            ex.Lanzar();
        }

        #endregion

        #region Métodos estaticos de Clase

        public static Articulo ObtenerPorId(string id)
        {
            Articulo obj = new Articulo();
            obj._id = id;
            if (obj.LeerDB())
            {
                return obj;
            }
            else
            {
                return null;
            }
        }

        public static List<Articulo> ObtenerTodos()
        {
            Articulo obj;
            List<Articulo> lista = new List<Articulo>();
            object[] parametros = { null, null, null, null, null, null };
            IDataReader dr;
            dr = DatosOleDb.DB().ObtenerDataReader("ArticuloSFiltro", parametros);
            while (dr.Read())
            {
                obj = new Articulo();
                obj.CargarDR(dr);             
                lista.Add(obj);
            }
            dr.Close();
            return lista;
        }

        public static List<Articulo> ObtenerPorFiltro(string id ,string  nombre)
        {
            Articulo obj;
            List<Articulo> lista = new List<Articulo>();
            object[] parametros = { id, nombre, null, null, null, null};
            IDataReader dr;
            dr = DatosOleDb.DB().ObtenerDataReader("ArticuloSFiltro", parametros);
            while (dr.Read())
            {
                obj = new Articulo();
                obj.CargarDR(dr);             
                lista.Add(obj);
            }
            dr.Close();
            return lista;
        }
        #endregion

        public override string ToString()
        {
                return _nombre;
        }
    }
}
